package org.aerie.forest.core.frame.rebar.factory;

import org.aerie.forest.core.frame.init.ForestFrameContext;
import org.aerie.forest.core.frame.rebar.entity.AbstractForestRebar;
import org.aerie.forest.core.frame.rebar.factory.ForestShelf.RebarScutcheon;

/**
 * @description forest架构元素工厂
 *
 * @author quark
 * @organization aerie
 * @date 2020年2月27日 下午3:56:31
 * @version 1.2.0
 */
public enum ForestFactory implements ForestFactoryComponent {

	/**
	 * @description 单例
	 * 
	 * @author quark
	 * @date 2020年2月27日 下午3:56:41
	 * @version 1.2.0
	 */
	INSTANCE;

	/**
	 * Construction
	 * 
	 *
	 * @date 2020年2月27日 下午4:09:16
	 * @version 1.2.0
	 */
	private ForestFactory() {
		if (!ForestFrameContext.INSTANCE.getLogInitSign()) {
			throw new RuntimeException("log未完成初始化，forest架构元素工厂初始化失败");
		}
		LOGGER.debug(LogMsgPool.INIT_COMPLETE, "forest架构元素工厂");
	}

	/**
	 * @description 获得架构元素【参数从forest货架中获取】
	 * @param <T>            根据泛型返回类型
	 * @param rebarScutcheon 货架名牌
	 * @return 获得需要取出的forest货架元素【根据泛型自动转成需要的类型】
	 *
	 * @date 2020年2月27日 下午4:09:46
	 * @version 1.2.0
	 */
	@SuppressWarnings("unchecked")
	public <T extends AbstractForestRebar> T getForestRebarFactory(RebarScutcheon<T> rebarScutcheon) {
		// 根据forest架构元素工厂的类别返回对应架构元素
		T result = (T) ForestContainer.INSTANCE.getForestRebar(rebarScutcheon);
		LOGGER.trace("forest架构元素工厂根据插入的名牌返回:{} 对象 => hashCode:{}", rebarScutcheon.getGenericityZclass().getSimpleName(),
				result.hashCode());
		return result;
	}

}
